package Excle.PubliceExcelUtils;

import cn.afterturn.easypoi.excel.ExcelExportUtil;
import cn.afterturn.easypoi.excel.ExcelImportUtil;
import cn.afterturn.easypoi.excel.entity.ExportParams;
import cn.afterturn.easypoi.excel.entity.ImportParams;
import com.yangjicong.o2o.studey.base.common.exception.BusinessException;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Workbook;
import org.springframework.util.CollectionUtils;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Base64;
import java.util.List;

/**
 * @Description excel工具类
 * @Author yangjicong
 * @Date 2022年9月20日10:56:46
 */
@Slf4j
public class ExcelUtils {

    /**
     * 导入excel(带解析参数)
     *
     * @param bytes     excel byte
     * @param pojoClass pojo类型
     * @param params    参数
     * @param <T>       解析泛型参数
     * @return 解析结果
     * @throws Exception
     */
    public static <T> List<T> importExcel(byte[] bytes, Class<T> pojoClass, ImportParams params) throws Exception {
        return ExcelImportUtil.importExcel(new ByteArrayInputStream(bytes), pojoClass, params);
    }

    /**
     * Excel导出
     *
     * @param list      数据集合
     * @param pojoClass pojo类型
     * @param <T>       实体类
     * @return 导出字节数据
     * @throws Exception
     */
    public static <T> byte[] exportExcel(List<T> list, Class<T> pojoClass) throws Exception {
        Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams(), pojoClass, list);
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        workbook.write(bos);
        return bos.toByteArray();
    }

    /**
     * 公共解析excel数据
     *
     * @param excelBase64Data excel base64编码
     * @param clazz           clazz
     * @param <T>             泛型
     * @return 解析集合
     */
    public static <T> List<T> parseExcel(String excelBase64Data, Class<T> clazz) {
        return parseExcel(excelBase64Data, clazz, new ImportParams());
    }

    /**
     * 公共解析excel数据
     *
     * @param excelBase64Data excel base64编码
     * @param clazz           clazz
     * @param <T>             泛型
     * @return 解析集合
     */
    public static <T> List<T> parseExcel(String excelBase64Data, Class<T> clazz, ImportParams importParams) {

        //处理excel数据
        byte[] excelData = Base64.getDecoder().decode(excelBase64Data);

        // 从excel中解析到的excel数据
        List<T> importList;

        try {
            importList = ExcelUtils.importExcel(excelData, clazz, importParams);

        } catch (Exception e) {
            log.error("解析excel文件失败");
            throw new BusinessException("解析excel失败");
        }

        if (CollectionUtils.isEmpty(importList)) {

            log.warn("导入数量为空，检查重试");
            throw new BusinessException("");
        }
        return importList;
    }

}
